package nsga.comparison;

import java.util.ArrayList;
import java.util.List;

import nsga.comparison.util.MetricsUtil;

public class Contribution {
	public MetricsUtil utils_; // utils_ is used to access to the
	// MetricsUtil funcionalities

	public Contribution() {
		utils_ = new MetricsUtil();
	}

	
	/**
	 * Returns the contribution value for myFront
	 * 
	 * @param myFront
	 *            我们方法一次的front
	 * @param pcmFront
	 *            PCM方法一次的front
	 */
	public double contribution(double[][] myFront, double[][] pcmFront) {		

		double contributionOfMy=0.0;
		double C = 0.0;//myFront与pcmFront交集，即相等的个数		
		List<double[]> W1 = new ArrayList<double[]>();//myFront中可支配pcmFront中的解的解集；		
		List<double[]> W2 = new ArrayList<double[]>();;//pcmFront中可支配myFront中的解的解集；		
		List<double[]> L1 = new ArrayList<double[]>();;//myFront中被pcmFront中的解支配的解集;		
		List<double[]> L2 = new ArrayList<double[]>();;//pcmFront中被myFront中的解支配的解集;		
		double N1 = 0.0;//myFront中，与pcmFront中的解不可比的解集长度，不考虑两个解相同。		
		double N2 = 0.0;//pcmFront中，与myFront中的解不可比的解集长度，不考虑两个解相同。		
		for(int i=0;i<myFront.length;i++){
			for(int j=0;j<pcmFront.length;j++){
				int rlt=utils_.isDominate(myFront[i], pcmFront[j]);
				if(rlt==1){
					if(!W1.contains(myFront[i])){
						W1.add(myFront[i]);
					}
					if(!L2.contains(pcmFront[j])){
						L2.add(pcmFront[j]);
					}				
				}else if(rlt==0){
					C+=1;
				}else if(rlt==-1){
					if(!L1.contains(myFront[i])){
						L1.add(myFront[i]);
					}
					if(!W2.contains(pcmFront[j])){
						W2.add(pcmFront[j]);
					}
				}
			}
		}
		N1 = myFront.length-C-W1.size()-L1.size();
		N2 = pcmFront.length-C-W2.size()-L2.size();
		
		contributionOfMy = (C/2+W1.size()+N1)/(C+W1.size()+N1+W2.size()+N2);
		return contributionOfMy;

	}
	
	
	public static void main(String[] args) {
		Contribution contribution = new Contribution();
		double[][] myFront =new double[][]{{1,7,0},{2,5,0},{3,4,0}};
		
		double[][] pcmFront=new double[][]{{2,7,0},{3,2,0},{4,1,0}};

		double contributionOfMy=contribution.contribution(myFront, pcmFront);
		System.out.println(contributionOfMy);
		
	}

}
